Pop:	inc byte [R_S]
	mov al, [R_S]
	mov ah, 1
	jmp RB

Push:	mov dl, al ; V becomes the second parameter to WB
	mov al, 0
R_S	equ $-1
	mov ah, 1
	dec byte [R_S]
	jmp WB

Misfire:
	; ax = reference page; dx = intended destination
        mov al, dl ; ax=wrapped address: al = new address, ah = old page
	cmp ax, dx
	jne RB ; If the wrapped address is not same, do extra read
	ret

ExecuteOpcode:
	mov al, [C_NMI]
	push ax
	 mov di, 0xC000
R_PC	 equ $-2

	 mov ax, di
	 inc di
	 call RB
	 mov ah, 0
	 mov [C_OPCODE], ax
	pop ax

	;;;;;;;;;;;
	;; TODO: insert NMI/IRQ
	;;;;;;;;;;;
	
	mov byte [C_PBITS], 0x30
	cmp byte [C_RESET], 0
	jne .GotReset
	cmp al, 0
	je .NotNMI
	cmp byte [C_NMI_EDGE], 0
	je .GotNMI
.NotNMI:cmp byte [C_IRQ], 0
	je .NotIRQ
	test byte [R_P], 4
	jz .GotIRQ
.NotIRQ:cmp al, 0
	jne short  .DoOpcode
	mov byte [C_NMI_EDGE], 0
	jmp short  .DoOpcode
.GotReset:
	mov al,1
	jmp short .GotSpecial
.GotNMI:
	mov byte [C_NMI_EDGE], 1
	mov al,0
	jmp short .GotSpecial
.GotIRQ:
	mov al,2
.GotSpecial:
	mov ah,1
	mov word [C_OPCODE], ax
	mov byte [C_PBITS], 0x20
	;jmp .DoOpcode
.DoOpcode:

	call DEBUG

	mov bx, word 0x0000
C_OPCODE	equ $-2
	mov cl, bl
	shr bx, 3 ; BX = C_OPCODE / 8
	and cl, 7 ; CL = C_OPCODE % 8
	mov al, 1
	shl al, cl
	mov [C_OPCODEBIT], al
	mov byte [C_SB], 0
	mov [mop_bx], bx

	xor si, si	; C_ADDR = 0
	xor bp, bp	; C_D    = 0
	mov cx, 0x00FF	; C_T and C_C

	mov bx, mop_engine

	; REGISTER ALLOCATION:
	;  AX, DX = function parameters and temporaries
	;  AL     = RB&WB return value
	;  AX     = wrap&Misfire return values
	
	;  DI = R_PC
	;  SI = C_ADDR (address operand, initialized to $0000)
	;  BP = C_D    (address index,   initialized to $0000)
	;  CL = C_T    (operand,        initialized to $FF)
	;  CH = C_C    (second operand, initialized to 0)
	;
	;  BX = mop_engine
	;
	; No function must trample these. In addition, Pop must not trample DX.

%macro opcode_test 2
	call bx
	dw %2
	db %1 - $ - 1
	;mov al, [C_OPCODEBIT]	;3 bytes
	;test al, [%2 + bx]	;4 bytes
	;jz short %1		;2 bytes
	; skip if the opcode did not match
%endm

;/* Decode address operand */
mop00:	opcode_test mop01, mop00data
	mov si, 0xFFFA ;// NMI vector location

mop01:	opcode_test mop02, mop01data
        mov si, 0xFFFC ;// Reset vector location

mop02:	opcode_test mop03, mop02data
	mov si, 0xFFFE ;// Interrupt vector location

mop03:	opcode_test mop04, mop03data
        mov ax, di
        inc di
        call RB
        movzx si, al

mop04:	opcode_test mop05, mop04data
	movzx bp, byte[R_X] ;// register index

mop05:	opcode_test mop06, mop05data
	movzx bp, byte[R_Y] ;// register index

mop06:	opcode_test mop07, mop06data
        lea si, [bp+si]   ;// add zeropage-index
        and si, 0xFF
        xor bp, bp
        call tick

mop07:	opcode_test mop08, mop07data
        mov ax, di      ;// absolute address
        inc di
        call RB
        mov dx, si
        mov dh, al
        mov si, dx

mop08:	opcode_test mop09, mop08data
        xchg si, ax
        push ax
         call RB
         movzx si, al
        pop ax
        mov dx, ax
        inc dx
        mov al, dl ; wrapped address: al = new address, ah = old page
        call RB
        mov dx, si
        mov dh, al
        mov si, dx ;// indirect w/ page wrap

mop09:	opcode_test mop10, mop09data
        mov ax, si
        lea dx, [bp+si]
	call Misfire	;// abs. load: extra misread when cross-page

mop10:	opcode_test mop11, mop10data
        mov ax, si ;// abs. store: always issue a misread
        lea dx, [bp+si]
        mov al, dl ; wrapped address: al = new address, ah = old page
	call RB

;/* Load source operand */
mop11:	opcode_test mop12, mop11data
        and cl, byte 0x00 ;// Many operations take A or X as operand. Some try in
R_A	equ $-1

mop12:	opcode_test mop13, mop12data
        and cl, byte 0x00  ;// error to take both; the outcome is an AND operation.
R_X	equ $-1

mop13:	opcode_test mop14, mop13data
        and cl, byte 0x00  ;// sty,dey,iny,tya,cpy
R_Y	equ $-1

mop14:	opcode_test mop15, mop14data
        and cl, [R_S] ;// tsx, las

mop15:	opcode_test mop16, mop15data
        mov al, byte 0x00
R_P	equ $-1
        or  al, byte 0x30
C_PBITS equ $-1
	and cl, al
        mov ch, cl ;// php, flag test/set/clear, interrupts

mop16:	opcode_test mop17, mop16data
        mov ch, cl
        mov cl, 0xFF         ;// save as second operand

mop17:	opcode_test mop18, mop17data
        lea ax, [bp+si]
	call RB
	and cl, al ;// memory operand

mop18:	opcode_test mop19, mop18data
        mov ax, di
        inc di
        call RB
        and cl, al  ;// immediate operand

;/* Operations that mogrify memory operands directly */
mop19:	opcode_test mop1A, mop19data
	mov al, cl
	and al, 0xC0
	mov ah, [R_P]
	and ah, 0x3F
	or al, ah
	mov [R_P], al ;// bit

mop1A:	opcode_test mop20, mop1Adata
	mov al, [R_P]
	and al, 1
	mov [C_SB], al	;// rol,rla, ror,rra,arr

mop20:	opcode_test mop21, mop20data
        mov al, cl
        shr al, 7 ;// rol,rla, asl,slo,[arr,anc]
        push word mop21
        mop_set_c:
          mov ah, [R_P]
          and ah, 0xFE
          or al, ah
          mov [R_P], al
          ret

mop21:	opcode_test mop22, mop21data
        mov al, cl
        and al, 1 ;// lsr,sre, ror,rra,asr
        call mop_set_c

mop22:	opcode_test mop23, mop22data
        shl cl, 1
        or cl, [C_SB]

mop23:	opcode_test mop24, mop23data
        shr cl, 1
        mov ah, 0
C_SB	equ $-1
        shl ah, 7
        or cl, ah

mop24:	opcode_test mop25, mop24data
        dec cl ;// dec,dex,dey,dcp
        ; ^ No cx. Must not wrap into ch.

mop25:	opcode_test mop26, mop25data
        inc cl  ;// inc,inx,iny,isb
        ; ^ No cx. Must not wrap into ch.

;/* Store modified value (memory) */
mop26:	opcode_test mop27, mop26data
        lea ax, [bp+si]
	mov dl, cl
	call WB

mop27:	opcode_test mop28, mop27data
        mov ax, si
        lea dx, [bp+si]
        mov al, dl   ; wrapped address: al = new address, ah = old page

        shr dx, 8
        and dl, cl
        mov cl, dl
        call WB		;// [shx,shy,shs,sha?]

;/* Some operations used up one clock cycle that we did not account for yet */
mop28:	opcode_test mop29, mop28data
        call tick ;// nop,flag ops,inc,dec,shifts,stack,transregister,interrupts

;/* Stack operations and unconditional jumps */
mop29:	opcode_test mop30, mop29data
        call tick
        call Pop
        mov cl, al                      ;// pla,plp,rti

mop30:	opcode_test mop31, mop30data
        mov ax, di
        inc di
        call RB
        call Pop
        mov dl, al
        call Pop
        mov dh, al
        mov di, dx ;// rti,rts

mop31:	opcode_test mop32, mop31data
        mov ax, di
        inc di
        call RB ;// rts

mop32:	opcode_test mop33, mop32data
        lea ax, [di-1] ; normal
        cmp word [C_OPCODE], 0
        jne .normal
        lea ax, [di+1] ; BRK
       .normal:
        push ax
         mov al, ah
         call Push
        pop ax
        call Push ;// jsr, interrupts

mop33:	opcode_test mop34, mop33data
        mov di, si ;// jmp, jsr, interrupts

mop34:	opcode_test mop35, mop34data
        mov al, cl
        call Push   ;// pha, php, interrupts

;/* Bitmasks */
mop35:	opcode_test mop36, mop35data
        mov cl, 1

mop36:	opcode_test mop37, mop36data
        shl cl, 1

mop37:	opcode_test mop38, mop37data
        shl cl, 2

mop38:	opcode_test mop39, mop38data
        shl cl, 4

mop39:	opcode_test mop40, mop39data
	not cl ;// sbc, isb,      clear flag

mop40:	opcode_test mop41, mop40data
        or cl, ch  ;// ora, slo,      set flag

mop41:	opcode_test mop42, mop41data
        and cl, ch ;// and, bit, rla, clear/test flag

mop42:	opcode_test mop43, mop42data
        xor cl, ch  ;// eor, sre

;/* Conditional branches */
mop43:	opcode_test mop44, mop43data
        mov al, cl
        or al, al
        jz .NoBranch1
    	call tick
    	mov dx, di
    	mov ax, si ;discard hi part.
    	;movsx ax, al
    	cbw
    	add ax, dx
    	mov di, ax
    	xchg dx, ax
    	call Misfire
   .NoBranch1:

mop44:	opcode_test mop45, mop44data
        mov al, cl
        or al, al
        jnz .NoBranch2
    	call tick
    	mov dx, di
    	mov ax, si ;discard hi part.
    	cbw
    	add ax, dx
    	mov di, ax
    	xchg dx, ax
    	call Misfire
   .NoBranch2:

;/* Addition and subtraction */
mop45:	opcode_test mop46, mop45data
        mov ch, cl
        mov ah, [R_P]
        and ah, 1
        add ah, 0xFF ; now host Cf is set if P.C was
        adc cl, [R_A]
        mov dh, 0
        rcl dh, 1 ; new carry flag is in DH
        mov dl, ch
        xor dl, cl   ; dl = c^t
        xor al, [R_A]; al = A^t
        and al, dl   ; al = (c^t) & (A^t)
        and al, 80h
        shr al, 1     
        or al, dh
         mov ah, [R_P]
         and ah, 0xFF-0x41
        or al, ah
        mov [R_P], al

mop46:	opcode_test mop47, mop46data
        mov al, ch
        sub al, cl
        mov cl, al
        ; FIXME: check if a CMC is necessary here
        cmc
        ;;;
        mov al, 0
        rcl al, 1 ;// cmp,cpx,cpy, dcp, sbx
        call mop_set_c

;/* Store modified value (register) */
mop47:	opcode_test mop48, mop47data
	mov [R_A], cl

mop48:	opcode_test mop49, mop48data
        mov [R_X], cl

mop49:	opcode_test mop50, mop49data
        mov [R_Y], cl

mop50:	opcode_test mop51, mop50data
        mov [R_S], cl

mop51:	opcode_test mop52, mop51data
        mov al, cl
        and al, 0xFF-0x30
        mov [R_P], al ;// plp, rti, flag set/clear

;/* Generic status flag updates */
mop52:	opcode_test mop53, mop52data
        mov al, cl
        and al, 0x80
        mov ah, [R_P]
        and ah, 0x7F
        or al, ah
        mov [R_P], al

mop53:	opcode_test mop54, mop53data
        mov al, [R_P]
        and al, 0xFD
        mov ah, cl
        or ah, ah
        jnz @@nz
        or al, 2
@@nz:   mov [R_P], al

mop54:	opcode_test mop_done, mop54data
        mov al, cl
        add al, 0x20
        and al, 0x40
        mov ah, [R_P]
        and ah, 0xBF
        or al, ah
        mov [R_P], al  ;// [arr]

mop_done:
	mov [R_PC], di
	mov byte [C_RESET], 0
	ret

section .const

mop35data: db 0x01,0x00,0x01,0x01,0x00,0x00,0x01,0x01,0x00,0x00,0x01,0x01,0x00,0x00,0x01,0x01,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x01,0x01,0x00,0x00,0x01,0x01,0x07
mop37data: db 0x01,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x07
mop40data: db 0xAB,0xA2,0xAA,0xAA,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x07
mop33data: db 0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07
mop28data: db 0xD9,0xD5,0xDC,0xDD,0xC9,0xC5,0xDC,0xDD,0xD8,0xC5,0xDC,0xDD,0xD9,0xC5,0xDC,0xDD,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0xC8,0xC5,0xDC,0xDD,0xC8,0xC5,0xDC,0xDD,0x07
mop51data: db 0x01,0x00,0x00,0x01,0x00,0x01,0x00,0x01,0x01,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x07
mop52data: db 0xEE,0xEE,0xEE,0xEA,0xEE,0xEE,0xEE,0xEA,0xEE,0xEE,0xEE,0xEA,0xEE,0xEF,0xEE,0xEA,0x00,0x0D,0x00,0x01,0xFF,0xFF,0xFE,0xFE,0xFB,0xFF,0xEE,0xEA,0xFB,0xFB,0xEE,0xEA
mop09data: db 0x00,0x00,0x02,0x32,0x00,0x00,0x02,0x32,0x00,0x00,0x02,0x32,0x00,0x00,0x02,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0xFA,0x00,0x00,0x02,0x32,0x00,0x00,0x02,0x32
mop10data: db 0x00,0x00,0x0C,0xC8,0x00,0x00,0x0C,0xC8,0x00,0x00,0x0C,0xC8,0x00,0x00,0x0C,0xC8,0x00,0x00,0x0E,0xFA,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0xC8,0x00,0x00,0x0C,0xC8
mop07data: db 0x00,0xF0,0x00,0xFA,0x01,0xF0,0x00,0xFA,0x00,0xF0,0x00,0xFA,0x00,0xF0,0x00,0xFA,0x00,0xF0,0x00,0xFA,0x00,0xF0,0x00,0xFA,0x00,0xF0,0x00,0xFA,0x00,0xF0,0x00,0xFA
mop05data: db 0x00,0x00,0x0E,0x0A,0x00,0x00,0x0E,0x0A,0x00,0x00,0x0E,0x0A,0x00,0x00,0x0E,0x0A,0x00,0x00,0xCE,0xCA,0x00,0x00,0xCE,0xCA,0x00,0x00,0x0E,0x0A,0x00,0x00,0x0E
mop06data: db 0x0A,0x00,0xF0,0x00,0x0A,0x00,0xF0,0x00,0x0A,0x00,0xF0,0x00,0x0A,0x00,0xF0,0x00,0x0A,0x00,0xF0,0x00,0x0A,0x00,0xF0,0x00,0x0A,0x00,0xF0,0x00,0x0A,0x00,0xF0
mop41data: db 0x00,0x00,0x01,0x01,0xBA,0xB2,0xAB,0xAA,0x00,0x00,0x01,0x01,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x01,0x01
mop38data: db 0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01
mop31data: db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
mop02data: db 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
mop48data: db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xCC,0xCC,0xCC,0xCC,0x00,0x0C,0x00
mop36data: db 0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x00,0x00
mop34data: db 0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07
mop53data: db 0xEE,0xEE,0xEE,0xEA,0xFE,0xFE,0xEE,0xEA,0xEE,0xEE,0xEE,0xEA,0xEE,0xEF,0xEE,0xEA,0x00,0x0D,0x00,0x01,0xFF,0xFF,0xFE,0xFE,0xFB,0xFF,0xEE,0xEA,0xFB,0xFB,0xEE,0xEA,0x00
mop47data: db 0xAE,0xAE,0xAA,0xAA,0xAE,0xAE,0xAA,0xAA,0xAE,0xAE,0xAA,0xAA,0xAE,0xAF,0xAA,0xAA,0x00,0x0C,0x00,0x01,0xAA,0xAA,0xAA,0xAA,0x00,0x00,0x00,0x00,0xAA,0xAA,0xAA,0xAA,0x00
mop26data: db 0xC8,0xC0,0xCC,0xC8,0xC8,0xC0,0xCC,0xC8,0xC8,0xC0,0xCC,0xC8,0xC8,0xC0,0xCC,0xC8,0xFA,0xF0,0xFE,0x22,0x00,0x00,0x00,0x00,0xC8,0xC0,0xCC,0xC8,0xC8,0xC0,0xCC,0xC8,0x00
mop08data: db 0x0B,0x00,0x0E,0x00,0x0A,0x00,0x0E,0x00,0x0A,0x00,0x0E,0x00,0x0A,0x10,0x0E,0x00,0x0A,0x00,0x0E,0x00,0x0A,0x00,0x0E,0x00,0x0A,0x00,0x0E,0x00,0x0A,0x00,0x0E,0x00,0x07
mop11data: db 0xAE,0xAE,0xAA,0xAA,0xBE,0xBE,0xAA,0xAA,0xAE,0xAF,0xAA,0xAA,0x04,0x0C,0x00,0x00,0xAA,0xAA,0xAA,0xAA,0x00,0x05,0x00,0x00,0xAA,0xAA,0xAA,0xAA
mop29data: db 0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x01
mop50data: db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x08
mop54data: db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08
mop27data: db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xD8
mop13data: db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x11,0x11,0x10,0x11,0x00,0x00,0x00,0x00,0x11,0x11
mop30data: db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
mop32data: db 0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07
mop03data: db 0xFA,0xF0,0xFF,0xFA,0xFB,0xF0,0xFF,0xFA,0xFA,0xF0,0xFF,0xFA,0xFA,0xF0,0xFF,0xFA,0xFA,0xF0,0xFF,0xFA,0xFA,0xF0,0xFF,0xFA,0xFA,0xF0,0xFF,0xFA,0xFA,0xF0,0xFF,0xFA,0x00
mop04data: db 0x0A,0x00,0xF0,0xF0,0x0A,0x00,0xF0,0xF0,0x0A,0x00,0xF0,0xF0,0x0A,0x00,0xF0,0xF0,0x0A,0x00,0x30,0x30,0x0A,0x00,0x30,0x30,0x0A,0x00,0xF0,0xF0,0x0A,0x00,0xF0,0xF0,0x00
mop22data: db 0xCC,0xC4,0xCC,0xC8,0xCC,0xC4,0xCC,0xC8
mop00data: db 0x00,0x00,0x00,0x00,0x00,0x00,0x00
mop25data: db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0xC8,0xC1,0xCC,0xC8,0x00
mop20data: db 0xCC,0xCC,0xCC,0xC8,0xCC,0xCC,0xCC,0xC8,0x00,0x00,0x00,0x00,0x00,0x08
mop14data: db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C
mop45data: db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xAA,0xA2,0xAA,0xAA,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xAA,0xAA,0xAA,0xAA,0x00
mop16data: db 0xAA,0xA2,0xAA,0xAA,0xBA,0xB2,0xAA,0xAA,0xAA,0xA2,0xAA,0xAA,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xBB,0xBA,0xAA,0xAA,0x11,0x10
mop1Adata: db 0x00,0x00,0x00,0x00,0xCC,0xC4,0xCC,0xC8,0x00,0x00,0x00,0x00,0xCC,0xCC,0xCC,0xC8,0x00
mop12data: db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC8,0xCC,0xCC,0xCC,0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x00,0x11,0x11
mop21data: db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xCC,0xCC,0xCC,0xC8,0xCC,0xC4,0xCC,0xC8
mop49data: db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x11,0x11,0x10,0x10,0x00,0x01
mop42data: db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xAA,0xA2,0xAA,0xAA
mop46data: db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xBB,0xBA,0xAA,0xAA,0x11,0x10
mop23data: db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xCC,0xCC,0xCC,0xC8,0xCC,0xCC,0xCC,0xC8
mop24data: db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xC8,0xC4,0xCC,0xC8
mop43data: db 0x00,0x00,0x00,0x00
mop44data: db 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00
mop39data: db 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0xAA,0xAA,0xAA,0xAA,0x00
mop15data: db 0x01,0x01,0x01,0x01,0x00,0x00,0x01,0x01,0x00,0x00,0x01,0x01,0x00,0x00,0x01,0x01,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x01,0x01,0x00,0x00,0x01,0x01,0x07
mop18data: db 0x04,0x0A,0x00,0x00,0x04,0x0A,0x00,0x00,0x04,0x0A,0x00,0x00,0x04,0x0A,0x00,0x00,0x05,0x0A,0x00,0x00,0x05,0x0A,0x00,0x00,0x05,0x0A,0x00,0x00,0x05,0x0A
mop19data: db 0x00,0x00,0x00,0x00,0x10,0x10
mop01data: db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
mop17data: db 0xEA,0xE0,0xEE,0xEA,0xFA,0xF0,0xEE,0xEA,0xEA,0xE0,0xEE,0xEA,0xEA,0xE0,0xEE,0xEA,0x00,0x00,0x00,0x00,0xFA,0xF0,0xFE,0xFA,0xFA,0xF0,0xEE,0xEA,0xFA,0xF0,0xEE,0xEA,0x00

section .text

mop_engine:
	; This only purpose of this function is
	; to make the opcode_test macro take 5 bytes
	; rather than 9 bytes per call site.
	pop bx
	push di
	mov di, .return-2
	
	mov ax, [bx]

	 mov dl, [bx+2]
	 sub bx, di
	 inc bx
	 mov [di], bx

	xchg bx, ax
	mov al, 0
    C_OPCODEBIT EQU $-1
	test al, [bx + 0xC3C3]
    mop_bx equ $-2
	jnz .no_skip

	mov dh, 0
	add [di], dx
    .no_skip:
	pop di
	mov bx, mop_engine
	jmp .return + 0xC3C3
    .return:

;1B9
;A3E7

	

%include "disasm.inc"

%include "cpu.asm"


